//
//  UserAccountViewModel.swift
//  SinaMicroBlog
//
//  Created by wxy on 15/9/6.
//  Copyright © 2015年 wxy. All rights reserved.
//

import UIKit
import ReactiveCocoa

class UserAccountViewModel: NSObject {
    
    // 单例
    static let sharedUserAccount = UserAccountViewModel()
    
    override init() {
        userAccount = UserAccount.loadUserAccount()
    }
    
    // 用户账户
    var userAccount: UserAccount?
    // accessToken
    var accessToken: String? {
        
        return userAccount?.access_token
    }
    
    // 用户登陆标记
    var userLogin: Bool {
        
        return accessToken != nil
    }
    
    //用户头像URL
    var avatarURL: NSURL? {
        // 不应该强行解包 因为用户的头像可能不会设置 用系统默认的
        return NSURL(string: userAccount?.avatar_large ?? "")
    }
    
    // MARK: - 加载网络数据
    /// 加载用户 accessToken & 用户信息
    func loadUserAccount(code: String) -> RACSignal {
        
        return RACSignal.createSignal({ (subscriber) -> RACDisposable! in
            
            // doNext 可以给信号增加附加操作，第一个信号完成之后，将第一个信号的result传递给第二个信号
            // doNext 后面一定要加一个 subscriberXXX，否则doNext不会被执行
            NetworkTools.sharedNetworkTools.loadAccessToken(code).doNext({ (result) -> Void in
                
                // 创建用户模型，as! 将一个对象视为什么类型 !/? 取决于参数的需求
                let account = UserAccount(dict: result as! [String : AnyObject])
                
                // 设置当前账户的属性
                self.userAccount = account
                
                printLog(account)
                
                // 再次发送网络请求，拿用户信息
                NetworkTools.sharedNetworkTools.loadUserInfo(account.uid!).subscribeNext({ (result) -> Void in
                    
                    // printLog(result)
                    let dict = result as! [String: AnyObject]
                    
                    // 设置账号属性
                    account.name = dict["name"] as? String
                    account.avatar_large = dict["avatar_large"] as? String
                    
                    printLog(account)
                    
                    // 保存账号
                    account.saveUserAccount()
                    
                    // 通知订阅者网络数据加载完成
                    subscriber.sendCompleted()
                    
                    }, error: { (error) -> Void in

                        subscriber.sendError(error)
                    })
                
            }).subscribeError({ (error) -> Void in
                
                subscriber.sendError(error)
            })
            
            return nil
        })
        
    }

}
